package com.ce.framework.datamaintain.logic;

import java.util.Date;

import com.ce.framework.datamaintain.action.SearchAction;
import com.ce.framework.exception.AppException;
import com.ce.framework.util.DateUtil;
import com.ce.framework.util.StringUtil;
import com.ce.sys.login.model.User;


public abstract class SQLSearchCondition implements ISearchCondition,ISQLMapper{

	/*
	 * 使用js框架分页时进行排序的必要属性
	 */
	protected String order;   //排序方法
	protected String sort;  //排序字段
	protected String allSrhConds;//更多查询的查询条件


	public ISQLMapper getSQLMapper(){
		return this;
	}
	
	public String getSearchCntSql()

	{

		StringBuffer sql = new StringBuffer();
		String SQL = null;
		try {
			SQL = this.getSearchSql();
		} catch (AppException e) {
			
			e.printStackTrace();
		}
		if(SQL!=null){
			if((SQL.trim().substring(0, 6).toUpperCase().equals("SELECT")))
				sql.append("select count(*) from(").append(SQL).append(")");
		}else{
			sql.append("select count(*) ").append(SQL);
		}
		return sql.toString();
	}

	public void initCondition(SearchAction action,boolean search) throws AppException {
		// TODO Auto-generated method stub
	}
	
	/**
	* 开发人：andy
	* 开发日期: 2013-11-6  上午10:16:39
	* 功能描述: 根据order和sort组合排序SQL子句，注：返回内容中不包括order by
	* 方法的参数和返回值: vcTypeName转换为vc_type$name
	* @return
	*/
	protected String getOrderBy(){
		if(StringUtil.isBlank(sort)){
			return "";
		}
		StringBuffer od = new StringBuffer();
		if(sort.startsWith("n")){
			od.append("n_").append(sort.substring(1).replaceAll("[A-Z]","\\$$0"));
		}
		else{
			od.append(sort.replaceAll("[A-Z]","\\$$0").replaceFirst("\\$([A-Z])","_$1"));
		}
		od.append(" ").append(order);
		return od.toString();
	}
	
	
	/**
	* 开发人：andy
	* 开发日期: 2013-11-6  上午10:16:39
	* 功能描述: 根据order和sort组合排序SQL子句，注：返回内容中不包括order by
	* 方法的参数和返回值: vcTypeName转换为vc_type_name
	* @return
	*/
	protected String getOrderByUnderLine(){
		if(StringUtil.isBlank(sort)){
			return "";
		}
		StringBuffer od = new StringBuffer();
		if(sort.startsWith("n")){
			od.append("n_").append(sort.substring(1).replaceAll("[A-Z]","\\_$0"));
		}
		else{
			od.append(sort.replaceAll("[A-Z]","\\_$0"));
		}
		/*
		 * 2015-06-08 by 刘渝洪，开始
		 * 添加代码，对页面排序时错误使用的字段“down_date_string”处理为“DT_DATE”
		 */
		if("DOWN_DATE_STRING".equalsIgnoreCase(od.toString())){
			od = new StringBuffer();
			od.append("DT_DATE");
		}
		/* 2015-06-08 by 刘渝洪，开始 */
		od.append(" ").append(order);
		return od.toString();
	}
	
	/**
	* 开发人：andy
	* 开发日期: 2013-11-6  上午11:30:59
	* 功能描述: 获取日期的判定条件
	* 方法的参数和返回值: 
	* @param field
	* @param beginDate
	* @param endDate
	* @return
	*/
	protected String getDateCondition(String field,String beginDate,String endDate){
		StringBuffer sql = new StringBuffer();
		if(StringUtil.isNotBlank(beginDate)){
			sql.append(" and ").append(field).append(">=to_date('").append(beginDate)
			.append(" 00:00:00','yyyy-mm-dd hh24:mi:ss') ");
		}
		if(StringUtil.isNotBlank(endDate)){
			sql.append(" and ").append(field).append("<=to_date('").append(endDate)
			.append(" 23:59:59','yyyy-mm-dd hh24:mi:ss') ");
		}
		return sql.toString();
	}
	
	/**
	* 开发人：andy
	* 开发日期: 2013-11-6  上午11:30:59
	* 功能描述: 获取日期的判定条件
	* 方法的参数和返回值: 
	* @param field
	* @param beginDate
	* @param endDate
	* @return
	*/
	protected String getDateTimeCondition(String field,String beginDate,String endDate){
		StringBuffer sql = new StringBuffer();
		if(StringUtil.isNotBlank(beginDate)){
			sql.append(" and ").append(field).append(">=to_date('").append(beginDate)
			.append("','yyyy-mm-dd hh24:mi:ss') ");
		}
		if(StringUtil.isNotBlank(endDate)){
			sql.append(" and ").append(field).append("<=to_date('").append(endDate)
			.append("','yyyy-mm-dd hh24:mi:ss') ");
		}
		return sql.toString();
	}

	/**
	 * @author ： andy
	 * @since： Mar 5, 2012 3:39:35 PM
	 * 功能描述：获取日期的判定条件，用于通过参数传递形成的sql
	 * 方法的参数和返回值
	 * @param field      表中要查询的字段名称
	 * @param beginDate  condition中的参数值
	 * @param endDate    condition中的参数值
	 * @param beginDateParm   要转换的参数名称
	 * @param endDateParm     要转换的参数名称
	 * @return
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	protected String getDateCondition(String field,String beginDate,String endDate,String beginDateParm,String endDateParm){
		StringBuffer sql = new StringBuffer();
		if(StringUtil.isNotBlank(beginDate)){
			sql.append("and ").append(field).append(">=to_date(").append(beginDateParm)
			.append("||' 00:00:00','yyyy-mm-dd hh24:mi:ss') ");
		}
		if(StringUtil.isNotBlank(endDate)){
			sql.append("and ").append(field).append("<=to_date(").append(endDateParm)
			.append("||' 23:59:59','yyyy-mm-dd hh24:mi:ss') ");
		}
		return sql.toString();
	}

	/**
	 * 将传入的参数值中的'转换为''，避免客户端进行注入攻击,同时分号(;) 和 注释符号(--)也给进行替换
	 * @param val
	 * @return
	 */
	protected String getSafeValue(Object val){
		if(val==null){
			return "";
		}
		else if(val instanceof String){
			return StringUtil.filterSqlContent(val.toString());
//			return val.toString().replace("'", "''").replace("--", "").replace(";", "");
		}
		else{
			return val.toString();
		}
	}
	

	public String getOrder() {
		return order;
	}

	public void setOrder(String order) {
		this.order = order;
	}


	public String getSort() {
		return sort;
	}

	public void setSort(String sort) {
		this.sort = sort;
	}
	
	public String getCurUserId(){
		return User.getUserId();
	}

	public String getUserName(){
		return User.getUserName();
	}

	public String getCurDepId(){
		return User.getUserOrgId();
	}

	public String getCurDepName(){
		return User.getUserOrgName();
	}

	public String getCurOrgId(){
		User user = User.getUser();
		return user==null?null:user.getOrgManProId();
	}

	public String getCurOrgName(){
		User user = User.getUser();
		return user==null?null:user.getOrgManProName();
	}

	public String getCurOrgType(){
		User user = User.getUser();
		return user==null?null:user.getOrgManProFlag();
	}

	public String getAllSrhConds() {
		return allSrhConds;
	}

	public void setAllSrhConds(String allSrhConds) {
		this.allSrhConds = allSrhConds;
	}

	public String getDividePageSql(String sql, int begin, int end) {
		return "select * from (select sql_$t.*,rownum sql_$r from (" + sql + ") sql_$t where rownum<=" + 
				(end<0?"?":""+end) + ") where sql_$r>" + (begin<0?"?":""+begin);
	}

	@Override
	public String getExcelName() {
		return "导出文件"+DateUtil.format(new Date(),"yyyyMMddHHmm");
	}

}
